package cn.springsoter.core.tool.utils;

import java.math.BigDecimal;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字工具类
 * 
 * @author kevin
 *
 */
public class NumberUtil extends cn.hutool.core.util.NumberUtil {
	private NumberUtil() {}
	/**
	 * Random number.
	 *
	 * @param length
	 *            the length
	 * @return the string
	 * @Title: randomNumber
	 * @Description: 手机验证码：生成N位随机数
	 */
	public static String getRandomNumber(int length) {
		Random random = new Random();
		StringBuffer sf = new StringBuffer();
		for (int i = 0; i < length; i++) {
			int number = random.nextInt(10);// 0~9
			sf.append(number);
		}
		return sf.toString();
	}
	
	/**
	 * Ip to long.
	 * IP地址转化成long整型
	 * @param ipAddress the ip address
	 * @return the long
	 */
	public static long ipToLong(String ipAddress) {
		long result = 0;
		String[] ipAddressInArray = ipAddress.split("\\.");
		for (int i = 3; i >= 0; i--) {
			long ip = Long.parseLong(ipAddressInArray[3 - i]);
			// left shifting 24,16,8,0 and bitwise OR
			// 1. 192 << 24
			// 1. 168 << 16
			// 1. 1 << 8
			// 1. 2 << 0
			result |= ip << (i * 8);
		}
		return result;
	}

	/**
	 * Long to ip.
	 * long整型转化成IP地址
	 * @param i the i
	 * @return the string
	 */
	public static String longToIp(long i) {
		return ((i >> 24) & 0xFF) +
                   "." + ((i >> 16) & 0xFF) +
                   "." + ((i >> 8) & 0xFF) +
                   "." + (i & 0xFF);
	}
	
	/**
     * 匹配是否为数字
     * @param str 可能为中文，也可能是-19162431.1254，不使用BigDecimal的话，变成-1.91624311254E7
     * @return
     * @author yutao
     * @date 2016年11月14日下午7:41:22
     */
    public static boolean isNumeric(String str) {
        // 该正则表达式可以匹配所有的数字 包括负数
        Pattern pattern = Pattern.compile("-?[0-9]+(\\.[0-9]+)?");
        String bigStr;
        try {
            bigStr = new BigDecimal(str).toString();
        } catch (Exception e) {
            return false;//异常 说明包含非数字。
        }

        Matcher isNum = pattern.matcher(bigStr); // matcher是全匹配
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }
    
    /**
	 * BigDecimal -> long
	 * 
	 * @param decimal
	 * @return
	 */
	public static long longValue(BigDecimal decimal) {
        if (decimal == null) {
            return 0;
        }

        int scale = decimal.scale();
        if (scale >= -100 && scale <= 100) {
            return decimal.longValue();
        }

        return decimal.longValueExact();
    }
}
